import numpy as np
import scipy
import matplotlib.pyplot as plt
from scipy.io import wavfile
%matplotlib inline
!pip install mir_eval
!pip install librosa
import seaborn as sns
sns.set(style='ticks')
from IPython.display import Audio
import mir_eval
import librosa
import librosa.display
y,sampling_rate=librosa.load(librosa.util.example_audio_file())
print(y.shape,sampling_rate)
Audio(data=y,rate=sampling_rate)
librosa.display.waveplot(y,sampling_rate);
D=librosa.stft(y)
librosa.display.specshow(np.log(D**2),x_axis='time',y_axis='log')
plt.colorbar();
plt.plot(D);
C=librosa.cqt(y,sampling_rate)
log_power=librosa.power_to_db(D**2,ref=np.max)
log_amp=librosa.power_to_db(C**2)
librosa.display.specshow(log_amp,x_axis='time',y_axis='cqt_hz')
plt.colorbar();
log_amp2=librosa.power_to_db(C**2,top_db=40)
librosa.display.specshow(log_amp2,x_axis='time',y_axis='cqt_note')
plt.colorbar();
chroma=librosa.feature.chroma_cqt(C=C,sr=sampling_rate)
librosa.display.specshow(chroma,x_axis='time',y_axis='cqt_note')
plt.colorbar();
y_harmonic,y_percussive=librosa.effects.hpss(y)
Audio(data=y_harmonic,rate=sampling_rate)
Audio(data=y_percussive,rate=sampling_rate)
C_harmonic=librosa.cqt(y_harmonic,sampling_rate)
C_perc=librosa.cqt(y_percussive,sampling_rate)
plt.figure(figsize=(21,6))
plt.subplot(3,1,1),librosa.display.specshow(C**(1/3),x_axis='time',y_axis='cqt_hz');
plt.subplot(3,1,2),librosa.display.specshow(C_harmonic**(1/3),x_axis='time',y_axis='cqt_hz');
plt.subplot(3,1,3),librosa.display.specshow(C_perc**(1/3),x_axis='time',y_axis='cqt_hz');
onset_envelope=librosa.onset.onset_strength(y,sampling_rate)
onsets=librosa.onset.onset_detect(onset_envelope=onset_envelope)
plt.figure(figsize=(21,10))
plt.subplot(2,1,1)
plt.plot(onset_envelope,label='Onset Strength')
plt.vlines(onsets,0,onset_envelope.max(),color='r',alpha=0.5,label='Onsets')
plt.xticks([]),plt.yticks([])
plt.legend(frameon=True)
plt.axis('tight')
plt.subplot(2,1,2)
librosa.display.waveplot(y,sampling_rate);
tempo,beats=librosa.beat.beat_track(onset_envelope=onset_envelope)
plt.figure(figsize=(21,6))
plt.plot(onset_envelope,label='Onset Strength')
plt.vlines(beats,0,onset_envelope.max(),color='r',alpha=0.5,label='Beats')
plt.xticks([]),plt.yticks([])
plt.legend(frameon=True)
plt.axis('tight');
beat_times=librosa.frames_to_time(beats)
y_click=mir_eval.sonify.clicks(beat_times,sampling_rate,length=len(y))
Audio(data=y+y_click,rate=sampling_rate)
!pip install music21
!pip install midiutil
import IPython.display as ipd
from ipywidgets import interactive_output
from ipywidgets import IntSlider,FloatSlider,fixed,Checkbox
from ipywidgets import VBox,Label
from midiutil import MIDIFile
from music21.tempo import MetronomeMark
from music21.note import Note,Rest
from music21.stream import Stream
from music21 import metadata
from music21 import instrument
from music21 import midi
from music21.key import Key
path='./Downloads/'
plt.rc('figure',figsize=(17,8))
fs=44100
nfft=2048
overlap=0.5
hop_length=int(nfft*(1-overlap))
n_bins=72
mag_exp=4
pre_post_max=6
cqt_threshold=-61
#filename='%sGuns N39 Roses - Sweet Child O39 Mine.mp3'%path
filename='%sLamb Of God - Walk With Me In Hell LYRICS.mp3'%path
x,fs=librosa.load(filename,sr=None,mono=True,duration=30)
print(x.shape)
print(fs)
print('Audio length:%d'%(x.shape[0]/fs))
ipd.Audio(x,rate=fs)
cqt_freqs=librosa.core.cqt_frequencies(n_bins=128,fmin=librosa.note_to_hz('c0'),bins_per_octave=12)
fft_freqs=librosa.fft_frequencies(sr=44100,n_fft=128)
notes_freqs=440*2**(np.arange(-57,(128-57))/12)
plt.figure()
plt.plot(cqt_freqs,'bo',label='CQT')
plt.plot(fft_freqs,'rD',label='FFT')
plt.plot(notes_freqs,'g',label='Notes')
plt.title('CQT vs FFT')
plt.xlabel('Bin Number')
plt.ylabel('Freq [Hz]')
plt.legend();
def calc_cqt(x,fs=fs,hop_length=hop_length,n_bins=n_bins,mag_exp=mag_exp):
C=librosa.cqt(x,sr=fs,hop_length=hop_length,fmin=None,n_bins=n_bins)
C_mag=librosa.magphase(C)[0]**mag_exp
CdB=librosa.core.amplitude_to_db(C_mag,ref=np.max)
return CdB
def cqt_thresholded(cqt,thres=cqt_threshold):
new_cqt=np.copy(cqt)
new_cqt[new_cqt<thres]=-120
return new_cqt
def calc_onset_env(cqt):
return librosa.onset.onset_strength(S=cqt,sr=fs,aggregate=np.mean,hop_length=hop_length)
def calc_onset(cqt,pre_post_max=pre_post_max,backtrack=True):
onset_env=calc_onset_env(cqt)
onset_frames=librosa.onset.onset_detect(onset_envelope=onset_env,
sr=fs,units='frames',
hop_length=hop_length,
backtrack=backtrack,
pre_max=pre_post_max,
post_max=pre_post_max)
onset_boundaries=np.concatenate([[0],onset_frames,[cqt.shape[1]]])
onset_times=librosa.frames_to_time(onset_boundaries,sr=fs,hop_length=hop_length)
return [onset_times, onset_boundaries,onset_env]
style = {'description_width': 'initial'}
mag_exp_slider=IntSlider(value=mag_exp, min=1, max=32, step=1,
description='mag_exp:',continuous_update=False)
thres_slider=IntSlider(value=-61, min=-120, max=0, step=1,description='Threshold:',continuous_update=False)
pre_post_slider=IntSlider(value=pre_post_max, min=1, max=32, step=1,
description='Pre_post_max:',continuous_update=False, style=style)
backtrack_box=Checkbox(value=False,description='backtrack',disabled=False)
def inter_cqt_tuning(mag_exp,thres,pre_post_max, backtrack):
thres=thres_slider.value
mag_exp=mag_exp_slider.value
pre_post_max=pre_post_slider.value
backtrack=backtrack_box.value
global CdB
CdB = calc_cqt(x,fs,hop_length, n_bins, mag_exp)
plt.figure()
new_cqt=cqt_thresholded(CdB,thres)
librosa.display.specshow(new_cqt, sr=fs, hop_length=hop_length, x_axis='time', y_axis='cqt_note', cmap='coolwarm')
plt.ylim([librosa.note_to_hz('B2'),librosa.note_to_hz('B6')])
global onsets
onsets=calc_onset(new_cqt,pre_post_max, backtrack)
plt.vlines(onsets[0], 0, fs/2, color='k', alpha=0.8)
plt.title("CQT - Sweet Child O' Mine Intro")
plt.colorbar()
plt.show()
out = interactive_output(inter_cqt_tuning, {'mag_exp': mag_exp_slider, 'thres': thres_slider,
'pre_post_max': pre_post_slider, 'backtrack':backtrack_box})
ui = VBox([mag_exp_slider, thres_slider, pre_post_slider, backtrack_box])
display(ui, out)
tempo, beats=librosa.beat.beat_track(y=None, sr=fs, onset_envelope=onsets[2], hop_length=hop_length,start_bpm=120.0, tightness=100, trim=True, bpm=None,units='frames')
tempo=int(2*round(tempo/2))
mm = MetronomeMark(referent='quarter', number=tempo)
def time_to_beat(duration, tempo):
return (tempo*duration/60)
def remap(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
def generate_sine_midi_note(f0_info, sr, n_duration, round_to_sixtenth=True):
f0=f0_info[0]
A=remap(f0_info[1], CdB.min(), CdB.max(), 0, 1)
duration = librosa.frames_to_time(n_duration, sr=fs, hop_length=hop_length)
note_duration = 0.02*np.around(duration/2/0.02)
midi_duration = time_to_beat(duration, tempo)
midi_velocity=int(round(remap(f0_info[1], CdB.min(), CdB.max(), 0, 127)))
if round_to_sixtenth:
midi_duration=round(midi_duration*16)/16
if f0==None:
midi_note=None
note_info=Rest(type=mm.secondsToDuration(note_duration).type)
f0=0
else:
midi_note=round(librosa.hz_to_midi(f0))
note = Note(librosa.midi_to_note(midi_note), type=mm.secondsToDuration(note_duration).type)
note.volume.velocity = midi_velocity
note_info = [note]
midi_info = [midi_note, midi_duration, midi_velocity]
n = np.arange(librosa.frames_to_samples(n_duration, hop_length=hop_length ))
sine_wave = A*np.sin(2*np.pi*f0*n/float(sr))
return [sine_wave, midi_info, note_info]
def estimate_pitch(segment, threshold):
freqs = librosa.cqt_frequencies(n_bins=n_bins, fmin=librosa.note_to_hz('C1'),
bins_per_octave=12)
if segment.max()<threshold:
return [None, np.mean((np.amax(segment,axis=0)))]
else:
f0 = int(np.mean((np.argmax(segment,axis=0))))
return [freqs[f0], np.mean((np.amax(segment,axis=0)))]
def estimate_pitch_and_notes(x, onset_boundaries, i, sr):
n0 = onset_boundaries[i]
n1 = onset_boundaries[i+1]
f0_info = estimate_pitch(np.mean(x[:,n0:n1],axis=1),threshold=cqt_threshold)
return generate_sine_midi_note(f0_info, sr, n1-n0)
onsets[1]
music_info = np.array([
estimate_pitch_and_notes(CdB, onsets[1], i, sr=fs)
for i in range(len(onsets[1])-1)
])
onsets
synth_audio=np.concatenate(music_info[:,0])
ipd.Audio(synth_audio, rate=fs)
note_info = list(music_info[:,2])
s = Stream()
s.append(mm)
electricguitar = instrument.fromString('electric guitar')
electricguitar.midiChannel=0
electricguitar.midiProgram=30
s.append(electricguitar)
s.insert(0, metadata.Metadata())
s.metadata.title = "Sweet Child O' Mine - Introduction"
s.metadata.composer = "Guns n' Roses"
for note in note_info:
s.append(note)
key=s.analyze('key')
print(key.name)
s.insert(0, key)
s.show('text')
s.show('midi')
!pip install fretboard
print(s)
print(s.notes.stream)
for note in s.notes:
print(note.octave)
print(note.name)
!pip install console
from fretboard import *
fretboard.Fretboard(6)
!pip install Solala